package hashtable;

import java.util.HashSet;
import java.util.Set;

/**
 * @Author: 海琳琦
 * @Date: 2022/1/1 22:39
 * 编写一个算法来判断一个数 n 是不是快乐数。
 *
 * 「快乐数」定义为：
 *
 * 对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和。
 * 然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
 * 如果 可以变为  1，那么这个数就是快乐数。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/happy-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class IsHappy {

    /**
     * 暴力解法
     * @param n
     * @return
     */
    public static boolean isHappy(int n) {
        int sum = n;
        String s = String.valueOf(n);
        while (s.length() != 1) {
            for (int i = 0; i < s.length(); i++) {
                sum = getSum(Integer.valueOf(s));
            }
            s = String.valueOf(sum);
        }
        return sum==1||sum==7;
    }

    public static boolean isHappy1(int n) {
        Set<Integer> sets = new HashSet<>();
        while (n != 1 && !sets.contains(n)) {
            sets.add(n);
            n = getSum(n);
        }
        //跳出循环n==1 或者 集合中有包含关系（不是快乐数）
        return n == 1;
    }

    public static int getSum(int n) {
        int sum = 0;
        while (n > 0) {
            int r = n % 10;
            sum += r * r;
            n = n / 10;
        }
        return sum;
    }

    public static void main(String[] args) {
        System.out.println(isHappy(10));
    }
}
